using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace LS.Saving
{
    public interface ISavingManager
    {
        void SetHelper(ISavingHelper helper);

        void SetSavingPathType(SavingPathType pathType);
        
        /// <summary>
        /// 关闭manager
        /// </summary>
        void Shutdown();

        void Load(string groupName);
        
        void Load(string groupName, string fileName);
        
        void Load(string groupName, IDataFile file);
        
        void Save(string groupName, bool createNewFile);
        
        void Save(string groupName, IDataFile file);
        
        void Save(string groupName, string fileName);
        /// <summary>
        /// 获取所有游戏存档项的名称。
        /// </summary>
        /// <param name="groupName"></param>
        /// <returns>所有游戏存档项的名称。</returns>
        string[] GetAllDataNames(string groupName);

        /// <summary>
        /// 获取所有游戏存档项的名称。
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="results">所有游戏存档项的名称。</param>
        void GetAllDataNames(string groupName,List<string> results);

        bool IsLoaded(string groupName);
        
        bool IsLoaded(string groupName, string fileName);
        
        /// <summary>
        /// 存档文件是否存在
        /// </summary>
        /// <returns></returns>
        bool HasFile(string groupName, string fileName);

        /// <summary>
        /// 检查是否存在指定游戏存档项。
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="dataName">要检查游戏存档项的名称。</param>
        /// <returns>指定的游戏存档项是否存在。</returns>
        bool HasData(string groupName, string dataName);

        /// <summary>
        /// 移除指定游戏存档项。
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="dataName">要移除游戏存档项的名称。</param>
        /// <returns>是否移除指定游戏存档项成功。</returns>
        bool RemoveData(string groupName, string dataName);

        /// <summary>
        /// 清空所有游戏存档项。
        /// </summary>
        /// <param name="groupName"></param>
        void ClearData(string groupName);

        /// <summary>
        /// 删除所有存档
        /// </summary>
        void DeleteFile(string groupName);

        /// <summary>
        /// 从指定游戏存档项中读取布尔值。
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="dataName">要获取游戏存档项的名称。</param>
        /// <returns>读取的布尔值。</returns>
        bool GetBool(string groupName, string dataName);

        /// <summary>
        /// 从指定游戏存档项中读取布尔值。
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="dataName">要获取游戏存档项的名称。</param>
        /// <param name="defaultValue">当指定的游戏存档项不存在时，返回此默认值。</param>
        /// <returns>读取的布尔值。</returns>
        bool GetBool(string groupName, string dataName, bool defaultValue);

        /// <summary>
        /// 向指定游戏存档项写入布尔值。
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="dataName">要写入游戏存档项的名称。</param>
        /// <param name="value">要写入的布尔值。</param>
        void SetBool(string groupName, string dataName, bool value);

        /// <summary>
        /// 从指定游戏存档项中读取整数值。
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="dataName">要获取游戏存档项的名称。</param>
        /// <returns>读取的整数值。</returns>
        int GetInt(string groupName, string dataName);

        /// <summary>
        /// 从指定游戏存档项中读取整数值。
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="dataName">要获取游戏存档项的名称。</param>
        /// <param name="defaultValue">当指定的游戏存档项不存在时，返回此默认值。</param>
        /// <returns>读取的整数值。</returns>
        int GetInt(string groupName, string dataName, int defaultValue);

        /// <summary>
        /// 向指定游戏存档项写入整数值。
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="dataName">要写入游戏存档项的名称。</param>
        /// <param name="value">要写入的整数值。</param>
        void SetInt(string groupName, string dataName, int value);

        /// <summary>
        /// 从指定游戏存档项中读取浮点数值。
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="dataName">要获取游戏存档项的名称。</param>
        /// <returns>读取的浮点数值。</returns>
        float GetFloat(string groupName, string dataName);

        /// <summary>
        /// 从指定游戏存档项中读取浮点数值。
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="dataName">要获取游戏存档项的名称。</param>
        /// <param name="defaultValue">当指定的游戏存档项不存在时，返回此默认值。</param>
        /// <returns>读取的浮点数值。</returns>
        float GetFloat(string groupName, string dataName, float defaultValue);

        /// <summary>
        /// 向指定游戏存档项写入浮点数值。
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="dataName">要写入游戏存档项的名称。</param>
        /// <param name="value">要写入的浮点数值。</param>
        void SetFloat(string groupName, string dataName, float value);

        /// <summary>
        /// 从指定游戏存档项中读取字符串值。
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="dataName">要获取游戏存档项的名称。</param>
        /// <returns>读取的字符串值。</returns>
        string GetString(string groupName, string dataName);

        /// <summary>
        /// 从指定游戏存档项中读取字符串值。
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="dataName">要获取游戏存档项的名称。</param>
        /// <param name="defaultValue">当指定的游戏存档项不存在时，返回此默认值。</param>
        /// <returns>读取的字符串值。</returns>
        string GetString(string groupName, string dataName, string defaultValue);

        /// <summary>
        /// 向指定游戏存档项写入字符串值。
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="dataName">要写入游戏存档项的名称。</param>
        /// <param name="value">要写入的字符串值。</param>
        void SetString(string groupName, string dataName, string value);

        /// <summary>
        /// 获取存档组数量。
        /// </summary>
        /// <returns></returns>
        int GetGroupCount();
        
        /// <summary>
        /// 获取数据数量
        /// </summary>
        /// <param name="groupName"></param>
        /// <returns></returns>
        int GetDataCount(string groupName);
        
        /// <summary>
        /// 是否存在存档组。
        /// </summary>
        /// <param name="groupName"></param>
        /// <returns></returns>
        bool HasSavingGroup(string groupName);

        /// <summary>
        /// 添加存档组。
        /// </summary>
        /// <param name="groupName"></param>
        /// <returns></returns>
        bool AddSavingGroup(string groupName);

        /// <summary>
        /// 添加存档组。
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="folderName"></param>
        /// <returns></returns>
        bool AddSavingGroup(string groupName, string folderName);

        /// <summary>
        /// 添加存档组。
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="folderName"></param>
        /// <param name="extension"></param>
        /// <returns></returns>
        bool AddSavingGroup(string groupName, string folderName, string extension);
        
        /// <summary>
        /// 获取存档组。
        /// </summary>
        /// <param name="groupName"></param>
        /// <returns></returns>
        ISavingGroup GetSavingGroup(string groupName);

        /// <summary>
        /// 获取所有存档组。
        /// </summary>
        /// <returns></returns>
        ISavingGroup[] GetAllSavingGroup();

        /// <summary>
        /// 获取所有存档组。
        /// </summary>
        /// <param name="results"></param>
        void GetAllSavingGroup(List<ISavingGroup> results);
    }
}
